package reservation.v1;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Classe transport : modélisation d'un objet Transport bénéficiant des caractéristiques de capacité.
 * Elle est rattachée à l'enum TypeTransport qui regroupe les transports existants
 * 
 * @author Alexandre Boursier and Jerome Boursier
 * @version 2011.11.20
 */

public class Transport implements Serializable{

    private static final long serialVersionUID = -5629281599245045008L;

    /**
     * Type du transport choisi
     */
    private TypeTransport categorie;

    /**
     * Capacité d'accueil du transport
     */
    private int capacite;

    /**
     * static qui permet d'incrementer l'ident transport automatiquement
     */
    protected static int ident = 0;

    /**
     * Identifiant du transport
     */
    private int identTransport;

    /**
     * Créer un transport selon deux paramètres.
     * 
     * @param chosen
     *            Le type de transport choisi.
     * @param maximum
     *            La capacité du transport.
     * @throws NegativeValueException 
     * @throws NullPointerException 
     * @throws IOException 
     * @throws StartStopException 
     * @throws NumberFormatException 
     */
    public Transport(TypeTransport chosen, int maximum) throws NegativeValueException
    {
        if (maximum <= 0)
            throw new NegativeValueException(maximum);
        this.categorie = chosen;
        this.capacite = maximum;
        this.identTransport = Transport.ident;
        Transport.ident++;
    }

    /**
     * Ajouter tous les attributs d'un objet dans une liste
     * 
     * @return la liste des attributs d'un objet
     */
    public List<String> parse()
    {
        List<String> attributes = new ArrayList<String>();
        attributes.add("TRANSPORT");
        attributes.add(String.valueOf(identTransport));
        attributes.add(categorie.toString());
        attributes.add(String.valueOf(capacite));
        return attributes;
    }

    /**
     * Créer un transport existant dans la base de données (XML)
     * 
     * @param identifiant
     *            L'identifiant du transport cible
     * @param chosen
     *            Le type de transport choisi.
     * @param maximum
     *            La capacité du transport.
     * @throws NegativeValueException 
     */
    public Transport(int identifiant,TypeTransport chosen, int maximum) throws NegativeValueException
    {
        if (maximum <= 0)
            throw new NegativeValueException(maximum);
        this.identTransport = identifiant;
        if (Transport.ident <= identifiant)
            Transport.ident = identifiant + 1;
        this.categorie = chosen;
        this.capacite = maximum;
    }

    /**
     * @return le type de transport 
     */
    public TypeTransport getCategorie() {
        return categorie;
    }

    /**
     * @param le type de transport à modifier
     * @throws StartStopException 
     * @throws NegativeValueException 
     * @throws IOException 
     * @throws NullPointerException 
     * @throws NumberFormatException 
     */
    public void setCategorie(TypeTransport categorie) throws NumberFormatException, NullPointerException,
    IOException, NegativeValueException, StartStopException {
        this.categorie = categorie;
        SerializeObject.alter(this);
    }

    /**
     * @return la capacité du transport
     */
    public int getCapacite() {
        return capacite;
    }

    /**
     * @param la capacité du transport à modifier
     * @throws StartStopException 
     * @throws NegativeValueException 
     * @throws IOException 
     * @throws NullPointerException 
     * @throws NumberFormatException 
     */
    public void setCapacite(int capacite) throws NumberFormatException, NullPointerException,
    IOException, NegativeValueException, StartStopException {
        if (capacite <= 0)
            throw new NegativeValueException(capacite);
        this.capacite = capacite;
        SerializeObject.alter(this);
    }

    /**
     * @return the identTransport
     */
    public int getIdentTransport() {
        return identTransport;
    }

    /**
     * toString()
     * 
     * @return string contenant la liste des transports
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("Transport n°" + identTransport + "\n");
        sb.append("Type : " + categorie + "\n");
        sb.append("Capacité du transport : " + capacite + " places.\n");
        sb.append("---------------------------------- \n");
        return sb.toString();
    }

    /**
     * Surcharge de la méthode equals qui sera utilisé dans une liste lorsque 
     * la methode Liste.contains(Objet) est appellée
     * 
     * @param t
     *          L'objet cible
     * @return true si l'identifiant referant de l'objet est le même, false sinon
     */
    @Override
    public boolean equals(Object t)
    {
        Transport tr = (Transport)t;
        if(tr.getIdentTransport() == identTransport)
            return true;
        return false;
    }

}
